package com.nageoffer.onecoupon.framework.idempotent;

import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class ApiLogAop {

    /**
     * 切入点为所有controller
     * 第一个*表示表示方法的返回类型可以是任何类型
     * ..*表示类名可以是任意的，即该包及其子包下的所有类
     * 最后一个.*表示方法名可以是任意的
     * *(..)：表示方法可以有任意数量和类型的参数。.. 表示参数列表可以是任意的
     */
    @Pointcut("execution(* com.nageoffer.onecoupon.*.controller..*.*(..))")
    public void apiLogApoCut(){}

    @Around("apiLogApoCut()")
    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        // 获取请求方法
        String methodExplain = joinPoint.getSignature().getName();
        String requestData = "";
        // 获取请求参数
        if (joinPoint.getArgs().length > 0) {
            requestData = JSON.toJSONString(joinPoint.getArgs());
        }
        // 打印请求参数
        log.info("[{} start]==> {}", methodExplain, requestData);
        // 处理结果
        Object result = joinPoint.proceed();
        // 处理耗时
        long executionTime = System.currentTimeMillis() - start;
        String responseData = "";
        if (result != null) {
            responseData = JSON.toJSONString(result);
        }
        // 打印耗时和返回参数
        log.info("[{}ms] [{} end]==> {}", executionTime, methodExplain, responseData);
        return result;
    }
}
